#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:zhengxin
@file: 02_PandasSeries.py
@time: 2024/12/30  14:54
# @describe: Pandas 数据结构 - Series
"""
import numpy as np

"""
Pandas 数据结构 - Series
    Series 是 Pandas 中的一个核心数据结构，类似于一个一维的数组，具有数据和索引。
    Series 可以存储任何数据类型（整数、浮点数、字符串等），并通过标签（索引）来访问元素。
    Series 的数据结构是非常有用的，因为它可以处理各种数据类型，同时保持了高效的数据操作能力，比如可以通过标签来快速访问和操作数据。

Series 特点：
    一维数组：Series 中的每个元素都有一个对应的索引值。
    索引： 每个数据元素都可以通过标签（索引）来访问，默认情况下索引是从 0 开始的整数，但你也可以自定义索引。
    数据类型： Series 可以容纳不同数据类型的元素，包括整数、浮点数、字符串、Python 对象等。
    大小不变性：Series 的大小在创建后是不变的，但可以通过某些操作（如 append 或 delete）来改变。
    操作：Series 支持各种操作，如数学运算、统计分析、字符串处理等。
    缺失数据：Series 可以包含缺失数据，Pandas 使用NaN（Not a Number）来表示缺失或无值。
    自动对齐：当对多个 Series 进行运算时，Pandas 会自动根据索引对齐数据，这使得数据处理更加高效。
"""

# 我们可以使用 Pandas 库来创建一个 Series 对象，并且可以为其指定索引（Index）、名称（Name）以及值（Values）：
import pandas as pd

# 创建一个 Series对象，指定名称为'A'，值分别为 1，2，3，4
# 默认索引为 0，1，2，3
series = pd.Series([1, 2, 3, 4], name='A')

# 显示 series对象
print(series)

# 显式地设置索引
custom_index = [1, 2, 3, 4]  # 自定义索引
series_with_index = pd.Series([2, 3, 4, 5], index=custom_index, name='A')
print(series_with_index)

"""
创建 Series
    可以使用 pd.Series() 构造函数创建一个 Series 对象，传递一个数据数组（可以是列表、NumPy 数组等）和一个可选的索引数组。

    pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
    
参数说明: 
    data：Series 的数据部分，可以是列表、数组、字典、标量值等。如果不提供此参数，则创建一个空的 Series。
    index：Series 的索引部分，用于对数据进行标记。可以是列表、数组、索引对象等。如果不提供此参数，则创建一个默认的整数索引。
    dtype：指定 Series 的数据类型。可以是 NumPy 的数据类型，例如 np.int64、np.float64 等。如果不提供此参数，则根据数据自动推断数据类型。
    name：Series 的名称，用于标识 Series 对象。如果提供了此参数，则创建的 Series 对象将具有指定的名称。
    copy：是否复制数据。默认为 False，表示不复制数据。如果设置为 True，则复制输入的数据。
    fastpath：是否启用快速路径。默认为 False。启用快速路径可能会在某些情况下提高性能。
"""
#  Series 实例

a = [1, 2, 3]
myvar = pd.Series(a)
print(myvar)

# 没有指定索引，索引值就从 0 开始，我们可以根据索引值读取数据
print(myvar[1])

# 指定索引值
a = ["Google", "Runoob", "Wiki"]
myvar = pd.Series(a, index=["x", "y", "z"])
print(myvar)
# 根据索引值读取数据:
print(myvar["y"])


"""" 使用 key/value 对象，类似字典来创建 Series： """
sites = {1: "google1", 2: "Runoob1", 3: "Wiki1"}
myvar = pd.Series(sites)
print(myvar)


""" 如果我们只需要字典中的一部分数据，只需要指定需要数据的索引即可，如下实例： """
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites, index=[1, 2])
print(myvar)



""" 设置 Series 名称参数： """
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites, index=[1, 2], name="RUNOOB-Series-TEST")
print(myvar)





""" Series 方法 """
# 创建 Series
data = [1, 2, 3, 4, 5, 6]
index = ['a', 'b', 'c', 'd', 'e', 'f']
s = pd.Series(data=data, index=index)

# 查看基本信息
print("索引：", s.index)
print("数据：", s.values)
print("数据类型：", s.dtype)
print("前两行数据：", s.head(2))


# 使用 map 函数，将每个元素加倍
s_doubled = s.map(lambda x: x * 2)
print("元素加倍后：", s_doubled)


# 计算累计和
cumsum_s = s.cumsum()
print("计算累计和", cumsum_s)

# 查找缺失值（这里没有缺失值，所以返回的全是 False）
print("缺失值判断", s.isnull())

# 排序
sorted_s = s.sort_values()
print("排序后的 Series：", sorted_s)




""" 使用列表、字典或数组创建一个默认索引的 Series。 """
# 使用列表创建 Series
s = pd.Series([1, 2, 3, 4])

# 使用 NumPy 数组，创建Series
s = pd.Series(np.array([1, 2, 3, 4]))

# 使用字典创建 Series
s = pd.Series({"a": 1, "b": 2, "c": 3, "d": 4})
